package com.access.boot.autoconfigure.apisdk.proxy;

import com.access.boot.autoconfigure.apisdk.aop.DefaultProxyFactory;
import org.springframework.beans.factory.FactoryBean;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 通过 {@link DefaultProxyFactory} 生成代理类，都存储 {@link ProxyContainer} 容器，
 * 与 Spring 整合时，通过 {@link FactoryBean} 获取代理类时，优先从 {@link ProxyContainer} 中获取。
 *
 * <p>
 * 避免了这样一个场景：
 * 定义了 TokenService 开放API，被 Spring 扫描并注册到 Spring 容器，同时手动调用 {@link DefaultProxyFactory} API 生成代理类，
 * 同一个 TokenService 可能会生成了多次代理对象。
 * 与 Spring 整合时，优先从 {@link ProxyContainer} 中获取，获取不到时在再生成代理对象
 * <p>
 * 注：JDK 的动态代理会缓存生成的代理对象，当再次生成代理对象时，优先从缓存中获取，如果 ClassLoader 相同，并且缓存命中，直接返回
 *
 * @author YangZhen
 * @date 2023/2/2 10:59
 * @since 1.0.0
 */
public final class ProxyContainer {

    private final static Map<Object, Object> container = new ConcurrentHashMap<>();

    public static void add(Object obj, Object proxy) {
        if (obj instanceof Class) {
            
        }
        container.put(obj, proxy);
    }

    public static <T> T getProxy(Object obj) {
        return (T) container.get(obj);
    }
}
